package com.gdust.hzx.product.config;

import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * ClassName: RedisConfig
 * Package: com.gdust.hzx.product.config
 * Description: Redis 缓存配置类，使用 Spring Cache 框架与 Redis 集成实现缓存管理。
 * 需求：给查询所有的分类数据添加查询缓存，使用Spring Cache框架
 * 功能说明：
 * - 自定义 RedisCacheManager 配置，包括序列化方式和缓存过期时间。
 * - 为 Spring Cache 提供 Redis 缓存支持。
 *
 * 注解说明：
 * - @Configuration：声明当前类是一个配置类，代替 XML 配置文件，用于定义 Spring Bean。
 *
 * @Author syun
 * @Create 2024/12/26 13:08
 * @Version 1.0
 */
@Configuration // 标记为 Spring 配置类
public class RedisConfig {

    /**
     * 配置RedisTemplate，用于操作Redis中的数据
     *
     * @param redisConnectionFactory Redis连接工厂
     * @return RedisTemplate实例
     */
    @Bean
    @Primary
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        // 设置Redis连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 定义String类型序列化方式
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // 定义JSON格式的序列化方式
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        //序列号key value
        // 设置Redis键的序列化方式为字符串
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // 设置Redis值的序列化方式为JSON
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);

        // 初始化Bean属性
        redisTemplate.afterPropertiesSet();
        // 返回配置好的RedisTemplate
        return redisTemplate;
    }

    /**
     * 配置 Redis 缓存管理器
     *
     * 功能描述：
     * - 自定义 Redis 缓存管理器的序列化方式及过期时间。
     * - 使用 Lettuce 连接工厂与 Redis 进行交互。
     *
     * @param connectionFactory Redis 连接工厂，负责与 Redis 进行连接。
     * @return CacheManager Redis 缓存管理器实例。
     */
    @Bean
    public CacheManager cacheManager(LettuceConnectionFactory connectionFactory){
        //1.定义序列化器
        // 用于对 Redis 缓存的值进行 JSON 序列化
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 用于对 Redis 缓存的键进行字符串序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

        //2.配置Redis缓存
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                // 设置缓存的默认过期时间为 1000 秒
                .entryTtl(Duration.ofSeconds(1000))
                // 配置键的序列化方式
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringRedisSerializer))
                // 配置值的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer));

        // 3. 构建 Redis 缓存管理器
        RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
                // 设置默认缓存配置
                .cacheDefaults(config)
                //构建管理器
                .build();

        //返回返回缓存管理器
        return cacheManager;
    }



}
